import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.pylab import mpl
import mplfinance as mpf
import matplotlib

# 更全面地设置中文显示
# 尝试多种中文字体，确保有可用的字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 设置后端为Agg以避免显示问题
matplotlib.use('Agg')

# 读取Excel文件
df = pd.read_excel('比亚迪后复权历史行情数据.xlsx')
print("数据读取完成")
print(f"数据形状: {df.shape}")
print("\n数据前5行:")
print(df.head())

# 检查数据类型和列名
print("\n数据类型:")
print(df.dtypes)
print("\n数据列名:")
print(df.columns)

# 清理列名中的空格
df.columns = df.columns.str.strip()
print("\n清理后的列名:")
print(df.columns)

# 确保日期列是datetime类型
if '日期' in df.columns:
    df['日期'] = pd.to_datetime(df['日期'])
    df.set_index('日期', inplace=True)

# 对定量变量进行描述性分析
print("\n定量变量描述性分析:")
numeric_cols = df.select_dtypes(include=[np.number]).columns
print(df[numeric_cols].describe())

# 计算相关系数矩阵
print("\n相关系数矩阵:")
corr_matrix = df[numeric_cols].corr()
print(corr_matrix)

# 绘制相关系数热力图 - 使用英文标题避免中文显示问题
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=0.5, fmt='.2f')
plt.title('Correlation Heatmap')  # 使用英文标题
plt.tight_layout()
plt.savefig('相关系数热力图.png', dpi=300)
print("相关系数热力图已保存")

# 绘制2023年全年的收盘价时序图 - 使用英文标题避免中文显示问题
if '收盘' in df.columns:
    # 筛选2023年的数据
    df_2023 = df[df.index.year == 2023]
    
    plt.figure(figsize=(14, 7))
    plt.plot(df_2023.index, df_2023['收盘'], 'b-', linewidth=2)
    plt.title('BYD Stock Closing Price 2023')  # 使用英文标题
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.tight_layout()
    plt.savefig('2023年收盘价时序图.png', dpi=300)
    print("2023年收盘价时序图已保存")

# 绘制2023年4月到6月的K线图
if all(col in df.columns for col in ['开盘', '最高', '最低', '收盘', '成交量']):
    # 筛选2023年4月到6月的数据
    df_apr_jun_2023 = df[(df.index.year == 2023) & (df.index.month >= 4) & (df.index.month <= 6)]
    
    # 准备K线图数据
    k_data = df_apr_jun_2023[['开盘', '最高', '最低', '收盘', '成交量']].copy()
    k_data.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
    
    # 设置mplfinance的字体为支持英文的字体，避免中文显示问题
    mpf_style = mpf.make_mpf_style(base_mpf_style='charles', rc={'font.family': 'Arial'})
    
    # 使用mplfinance绘制K线图，使用英文标题
    mpf.plot(k_data, type='candle', volume=True, mav=(5, 10, 20), 
             title='BYD Stock Candlestick Chart (Apr-Jun 2023)', 
             ylabel='Price', ylabel_lower='Volume',
             style=mpf_style, savefig='2023年4月-6月K线图.png',
             figsize=(16, 10))
    print("2023年4月-6月K线图已保存")

    # K线图分析
    print("\nK线图分析:")
    # 计算基本统计量
    avg_price = k_data['Close'].mean()
    max_price = k_data['Close'].max()
    min_price = k_data['Close'].min()
    price_range = max_price - min_price
    
    # 计算涨跌幅
    daily_returns = k_data['Close'].pct_change()
    positive_days = (daily_returns > 0).sum()
    negative_days = (daily_returns < 0).sum()
    avg_daily_return = daily_returns.mean() * 100
    
    print(f"期间平均收盘价: {avg_price:.2f}")
    print(f"期间最高收盘价: {max_price:.2f}")
    print(f"期间最低收盘价: {min_price:.2f}")
    print(f"价格波动范围: {price_range:.2f}")
    print(f"上涨天数: {positive_days}")
    print(f"下跌天数: {negative_days}")
    print(f"平均日涨跌幅: {avg_daily_return:.2f}%")
else:
    print("\n无法绘制K线图，缺少必要的列数据")
    print(f"当前可用列: {df.columns.tolist()}")

print("\n分析完成！")